package leecode;
/**
 * @Author: 陈航 
 * @Date: 2021-07-10 12:44:16 
 * @Last Modified by: 陈航
 * @Last Modified time: 2021-07-15 22:47:08
 * 题目：两数之和
 * 题目描述： 给定一个整数数组 nums和一个整数目标值 target，请你在该数组中找出 和为目标值target的那两个整数，并返回它们的数组下标。
    //      你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。
    //      你可以按任意顺序返回答案。
 */




import java.util.HashMap;

class Solution_1 {
    // 解法一：暴力解法,时间复杂度：O(n*n),空间复杂度：O(1)
    public static int[] twoSum_1(int[] nums, int target) {
        int[] result = new int[] { 0, 1 };
        // 特殊情况判断
        if (nums.length == 2) {
            return result;
        }
        // 一般情况
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[i] + nums[j] == target) {
                    result[0] = i;
                    result[1] = j;
                    return result;
                }
            }
        }
        return result;
    }

    // 解法二：哈希表解法，时间复杂度：O(n)，空间复杂度：O(n)
    // 采用哈希表实现，使用数组元素值作为哈希表的key，其对应数组下标作为哈希表的value建立哈希表，
    // 使用HashMap类辅助实现，第一层循环O(n)，第二层循环O(1)
    public static int[] twoSum_2(int[] nums, int target) {
        int[] result = new int[] { 0, 1 };
        if (nums.length == 2) {
            return result;
        }
        // 一般情况
        // HasnMap的使用，初始化及赋值
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i], i);
        }
        // 一层for循环
        for (int i = 0; i < nums.length; i++) {
            if (map.get(target - nums[i]) != null) {
                result[0] = i;
                result[1] = map.get(target - nums[i]);
                if (result[0] != result[1]) {
                    break;
                }
            }
        }
        return result;
    }

    // 逐个遍历输出数组元素
    public static void printArray(int[] nums) {
        // print：打印后不换行
        // println:打印后换行
        System.out.print("[");
        for (int num : nums) {
            System.out.print(num);
            System.out.print(",");
        }
        System.out.println("]");
    }

    public static void main(String[] args) {
        int[] nums = new int[] { 2, 7, 11, 15 };
        int target = 9;
        printArray(nums);
        printArray(twoSum_1(nums, target));
        printArray(twoSum_2(nums, target));
    }
}
